package seqlist.oj;

public class Num203 {

    //当前单链表中存储的实际元素个数
    public ListNode removeElements(ListNode head, int val) {
//        while (head != null && head.val == val) {
//            ListNode node = head;
//            head = head.next;
//            node.next = null;
//        }
//        if (head == null) {
//            //此时单链表中的待删除元素已经删除完毕 单链表为空
//            return head;
//        } else {
//            //此时头节点处理完毕且单链表不为空
//            ListNode prev = head;
//            while (prev.next != null) {
//                if (prev.next.val == val) {
//                    //此时prev是待删除元素的前驱结点
//                    ListNode node = prev.next;
//                    prev.next = node.next;
//                    node.next = null;
//                } else {
//                    prev = prev.next;
//                }
//            }
//        }
//        return head;

 //虚拟头节点法
        ListNode dummyHead=new ListNode(-1);
        dummyHead.next=head;
        ListNode prev=dummyHead;
        while(prev.next!=null){
            if(prev.next.val==val){
                ListNode node =prev.next;
                prev.next=node.next;
                node.next=null;
            }else{
                prev=prev.next;
            }
        }
        return dummyHead.next;


// 递归法
//一定要注意语义！！ 不用管递归内部怎么写的，就想这个递归是干嘛的
// 传入一个链表，就能删除链表中所有值为val的结点
//        if(head==null){
//            return null;
//        }
//        head.next=removeElements(head.next,val);// 调用removeElements就能得到删除了所有值为val的结点，
//        并用head.nex接着removeElements的返回值
//        return head.val==val?head.next:head;//得到了除了头节点外的删除后的链表，现在只需要判断头节点，若头
//        节点待删除那就删除后返回head.next，若不是就返回head。

    }
}

